﻿#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <deque>

//class Student;
//
//
////继承
//class Person 
//{
//public:
//	friend void Display(const Person& per, const Student& stu);
//	//非默认构造
//	Person(const std::string& name, const std::string& address, int age)
//		:_name(name),
//		_address(address),
//		_age(age)
//	{}
//
//	//拷贝构造
//	Person(const Person& per) :_name(per._name), _age(per._age), _address(per._address)
//	{
//	}
//
//	void identity()
//	{
//		std::cout << "void identity()" << std::endl;
//	}
//
//	~Person()
//	{
//		std::cout << "~Person" << std::endl;
//	}
//
//
//protected:
//	std::string _name;
//	std::string _address;
//	int _age;
//};
//
//
//class Student :public Person
//{
//public:
//	friend void Display(const Person& per, const Student& stu);
//
//	Student(int stuid = 19220341,const std::string& name = "张三",const std::string& address = "哈尔滨", int age = 19) :Person(name,address,age), _stuid(stuid)
//	{}
//
//	//拷贝构造
//	Student(const Student& stu)
//		:_stuid(stu._stuid)
//		, Person(stu)//赋值兼容转换
//	{
//
//	}
//	Student& operator= (const Student & stu)
//	{
//		if (&stu != this)
//		{
//			Person::operator=(stu);
//			_stuid = stu._stuid;
//		}
//	}
//
//
//	~Student()
//	{
//		std::cout << "~Student" << std::endl;
//		Person::~Person();
//	}
//protected:
//	int _stuid;
//};
//
//class Teacher :public Person
//{
//protected:
//	int _teaid;
//};
////
////int main()
////{
////	Student stu1;
////	Teacher tea1;
////	stu1.identity();
////	tea1.identity();
////
////	return 0;
////}
//
//#define CONTAINER list
//
////继承类模板
//
//namespace wxd
//{
//	template<class T>
//	class stack :public std::CONTAINER<T>
//	{
//
//		void push(const T& val)
//		{
//			std::CONTAINER<T>::push_back(val);
//		}
//	};
//
//};
//
//
//
//void Display(const Person& per, const Student& stu)
//{
//	std::cout << per._age << std::endl;
//	std::cout << stu._stuid << std::endl;
//}
//
//int main()
//{
//	//赋值兼容转换
//	Student stu1(19220300,"李四","上海", 20);
//	Student stu2 = stu1;
//	//Person per1;
//	//Person* ptr = &stu1;
//	//Person& ref = stu1;
//	//Student* ptr1 = &per1;  -err
//
//
//	return 0;
//}

//
//class Person
//{
//public:
//    std::string _name; // 姓名
//};
//class Student : public Person
//{
//protected:
//    int _num; // 学号
//};
//class Teacher : public Person
//{
//protected:
//    int _id; // 职⼯编号
//};
//class Assistant : public Student, public Teacher
//{
//protected:
//    std::string _majorCourse; // 主修课程
//};
//int main()
//{
//    // 编译报错：error C2385: 对“_name”的访问不明确
//    Assistant a;
//    a._name = "peter";
//    // 需要显⽰指定访问哪个基类的成员可以解决⼆义性问题，但是数据冗余问题⽆法解决
//    a.Student::_name = "xxx";
//    a.Teacher::_name = "yyy";
//    return 0;
//}



class Person
{
public:
    virtual void BuyTicket()
    {
        std::cout << "买票-全价" << std::endl;
    }


    std::string _name; // 姓名
    
};
class Student : public Person
{
    virtual void BuyTicket()override
    {
        std::cout << "买票-半价" << std::endl;
    }


protected:
    int _num; // 学号
};

class Teacher : public Person
{
    virtual void BuyTicket()override
    {
        std::cout << "买票-教师价" << std::endl;
    }


protected:
    int _tea_num; 
};

void Func(Person* ptr)
{
    ptr->BuyTicket();
}

int main()
{
    Person p;
    Student s;
    Teacher t;
    Person* ptr1 = &p;
    Person* ptr2 = &s;
    Person* ptr3 = &t;
    
    Func(ptr1);
    Func(ptr2);
    Func(ptr3);

    return 0;
}

